package com.molichuxing.services.infrastructure.service;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.infrastructure.dto.request.create.EnterpriseScheduleCreateDto;
import com.molichuxing.services.infrastructure.dto.response.EnterpriseScheduleDto;
import com.molichuxing.services.property.EnterpriseScheduleStateEnum;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 企业排期
 *
 * @author zhaopenghui
 * @date 2020年6月3日
 */
public interface EnterpriseScheduleService extends RootService {

    /**
     * 分页获取订单排期
     *
     * @param params   orderCode：订单类型
     *                 enterpriseId:企业id
     * @param pageNum  页数
     * @param pageSize 每页条数
     * @return
     * @throws Exception
     */
    public Paged<EnterpriseScheduleDto> getSchedulePage(Map<String, Object> params, int pageNum, int pageSize)
            throws Exception;

    /**
     * 排起数
     *
     * @return
     */
    public Integer getScheduleCount();

    /**
     * 逾期未还款数
     *
     * @return
     */
    public Integer getScheduleOverdueCount();

    /**
     * 获取排期信息
     *
     * @param scheduleIds
     * @return
     */
    public List<EnterpriseScheduleDto> getScheduleByScheduleIds(List<Integer> scheduleIds);

    /**
     * 查询排期
     *
     * @param scheduleId
     * @return
     */
    public EnterpriseScheduleDto getScheduleById(Integer scheduleId);

    /**
     * 新增订单排期信息
     *
     * @param createDto 新增信息
     * @return Integer id
     */
    Integer create(EnterpriseScheduleCreateDto createDto);

    /**
     * 终止订单排期
     *
     * @param orderCode 订单号
     * @return
     */
    boolean modifyTermination(Long orderCode);

    /**
     * 获取企业订单排期信息
     *
     * @param orderCode 订单号
     * @param periods   排期
     * @return EnterpriseScheduleDto
     */
    EnterpriseScheduleDto getSchedule(Long orderCode, int periods);

    /**
     * 获取企业订单排期信息
     *
     * @param orderCode 订单号
     * @return List
     */
    List<EnterpriseScheduleDto> getSchedule(Long orderCode);

    /**
     * 获取企业订单排期信息
     *
     * @param orderCode 订单号
     * @param state     状态
     * @return List
     */
    List<EnterpriseScheduleDto> getSchedule(Long orderCode, EnterpriseScheduleStateEnum state);

    /**
     * 还款修改状态
     *
     * @param scheduleId    排期id
     * @param arrivalAmount 实付金额
     * @param payTime       支付时间
     * @return boolean
     */
    boolean modifyRepay(Integer scheduleId, BigDecimal arrivalAmount, LocalDateTime payTime);

    /**
     * 获取当前应还排期
     *
     * @param orderCode 订单号
     * @return EnterpriseScheduleDto
     */
    EnterpriseScheduleDto getCurrent(Long orderCode);

    /**
     * 根据订单号获取排期
     *
     * @param orderCodes
     * @return
     */
    public List<EnterpriseScheduleDto> getScheduleByOrderCodes(List<Long> orderCodes);
}
